import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
import sys

def check_matplotlib_installation():
    """检查matplotlib安装情况"""
    print("=== Matplotlib安装检查 ===\n")
    try:
        import matplotlib
        print(f"Matplotlib版本: {matplotlib.__version__}")
        print("✓ Matplotlib安装成功")
        return True
    except ImportError:
        print("✗ Matplotlib未安装")
        print("安装命令: pip3 install matplotlib")
        return False

def setup_chinese_font():
    """
    设置中文字体显示
    尝试多种方法解决中文显示问题
    """
    print("\n=== 中文字体设置 ===\n")
    
    # 方法1: 检查系统字体
    try:
        # 获取系统所有字体
        font_list = sorted([f.name for f in fm.fontManager.ttflist])
        chinese_fonts = []
        
        # 查找中文字体
        for font_name in font_list:
            if any(keyword in font_name.lower() for keyword in ['simhei', 'microsoft', 'song', 'kai', 'fang', 'heiti', '黑体', '宋体']):
                chinese_fonts.append(font_name)
        
        if chinese_fonts:
            # 使用第一个找到的中文字体
            plt.rcParams['font.family'] = [chinese_fonts[0]]
            print(f"✓ 使用系统字体: {chinese_fonts[0]}")
            return True
    except:
        pass
    
    # 方法2: 使用字体文件
    try:
        font_files = ['SourceHanSansSC-Bold.otf', 'simhei.ttf', 'msyh.ttc']
        for font_file in font_files:
            if os.path.exists(font_file):
                font_prop = fm.FontProperties(fname=font_file)
                plt.rcParams['font.family'] = [font_prop.get_name()]
                print(f"✓ 使用字体文件: {font_file}")
                return True
    except:
        pass
    
    # 方法3: 设置字体参数
    try:
        plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
        plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
        print("✓ 使用字体参数设置")
        return True
    except:
        pass
    
    print("⚠ 中文显示可能不正常，建议安装中文字体")
    return False

def basic_line_plot():
    """基本线性图绘制"""
    print("\n=== 基本线性图绘制 ===\n")
    
    # 创建数据
    x = np.arange(1, 11)
    y = 2 * x + 5
    
    # 创建图形
    plt.figure(figsize=(10, 6))
    plt.plot(x, y)
    
    # 设置标题和标签
    plt.title("Matplotlib 基础演示 - 线性图")
    plt.xlabel("X 轴标签")
    plt.ylabel("Y 轴标签")
    
    # 添加网格
    plt.grid(True, linestyle='--', alpha=0.7)
    
    plt.tight_layout()
    plt.show()

def format_string_demo():
    """格式化字符串演示"""
    print("\n=== 格式化字符串演示 ===\n")
    
    # 创建数据
    x = np.arange(1, 11)
    y = 2 * x + 5
    
    # 创建多个子图展示不同格式
    fig, axes = plt.subplots(2, 2, figsize=(12, 8))
    axes = axes.flatten()
    
    # 不同标记样式
    formats = ['ob', '^r--', 'sg-.', '*c:']
    titles = ['圆点标记 (ob)', '三角形虚线 (^r--)', '正方形点划线 (sg-.)', '星形虚线 (*c:)']
    
    for i, (fmt, title) in enumerate(zip(formats, titles)):
        axes[i].plot(x, y, fmt, linewidth=2, markersize=8)
        axes[i].set_title(title)
        axes[i].grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.suptitle("Matplotlib 格式化字符串演示", fontsize=14)
    plt.show()

def sine_wave_demo():
    """正弦波绘制演示"""
    print("\n=== 正弦波绘制演示 ===\n")
    
    # 计算正弦曲线上的点
    x = np.arange(0, 3 * np.pi, 0.1)
    y_sin = np.sin(x)
    y_cos = np.cos(x)
    y_tan = np.tan(x)
    
    # 创建图形
    plt.figure(figsize=(12, 8))
    
    # 绘制三条曲线
    plt.plot(x, y_sin, 'b-', linewidth=2, label='正弦函数 sin(x)')
    plt.plot(x, y_cos, 'r--', linewidth=2, label='余弦函数 cos(x)')
    plt.plot(x, y_tan, 'g:', linewidth=2, label='正切函数 tan(x)')
    
    # 设置图形属性
    plt.title('三角函数波形图', fontsize=14)
    plt.xlabel('X 轴 (弧度)')
    plt.ylabel('Y 轴')
    plt.grid(True, alpha=0.3)
    plt.legend()
    
    # 设置坐标轴范围
    plt.ylim(-2, 2)
    
    plt.tight_layout()
    plt.show()

def subplot_demo():
    """子图绘制演示"""
    print("\n=== 子图绘制演示 ===\n")
    
    # 创建数据
    x = np.arange(0, 3 * np.pi, 0.1)
    y_sin = np.sin(x)
    y_cos = np.cos(x)
    y_exp = np.exp(x/3) * np.sin(x)
    
    # 创建2x2的子图网格
    fig = plt.figure(figsize=(14, 10))
    
    # 第一个子图 - 正弦波
    plt.subplot(2, 2, 1)
    plt.plot(x, y_sin, 'b-')
    plt.title('正弦函数')
    plt.grid(True, alpha=0.3)
    
    # 第二个子图 - 余弦波
    plt.subplot(2, 2, 2)
    plt.plot(x, y_cos, 'r--')
    plt.title('余弦函数')
    plt.grid(True, alpha=0.3)
    
    # 第三个子图 - 指数衰减正弦波
    plt.subplot(2, 2, 3)
    plt.plot(x, y_exp, 'g-')
    plt.title('指数衰减正弦波')
    plt.grid(True, alpha=0.3)
    
    # 第四个子图 - 所有函数对比
    plt.subplot(2, 2, 4)
    plt.plot(x, y_sin, 'b-', label='sin(x)')
    plt.plot(x, y_cos, 'r--', label='cos(x)')
    plt.plot(x, y_exp, 'g:', label='exp(x/3)*sin(x)')
    plt.title('函数对比')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.suptitle('Matplotlib 子图演示', fontsize=16)
    plt.show()

def bar_chart_demo():
    """条形图绘制演示"""
    print("\n=== 条形图绘制演示 ===\n")
    
    # 创建数据
    categories = ['产品A', '产品B', '产品C', '产品D', '产品E']
    sales_2023 = [23, 45, 56, 34, 67]
    sales_2024 = [34, 52, 61, 45, 72]
    
    x_pos = np.arange(len(categories))
    width = 0.35  # 条形宽度
    
    # 创建图形
    plt.figure(figsize=(12, 8))
    
    # 绘制条形图
    bars1 = plt.bar(x_pos - width/2, sales_2023, width, 
                   label='2023年销量', color='skyblue', edgecolor='black')
    bars2 = plt.bar(x_pos + width/2, sales_2024, width, 
                   label='2024年销量', color='lightcoral', edgecolor='black')
    
    # 设置图形属性
    plt.title('产品年度销量对比', fontsize=14)
    plt.xlabel('产品类别')
    plt.ylabel('销量 (万件)')
    plt.xticks(x_pos, categories)
    plt.legend()
    plt.grid(True, axis='y', alpha=0.3)
    
    # 在条形上添加数值标签
    for bars in [bars1, bars2]:
        for bar in bars:
            height = bar.get_height()
            plt.text(bar.get_x() + bar.get_width()/2., height,
                    f'{height}', ha='center', va='bottom')
    
    plt.tight_layout()
    plt.show()

def histogram_demo():
    """直方图绘制演示"""
    print("\n=== 直方图绘制演示 ===\n")
    
    # 创建随机数据
    np.random.seed(42)  # 保证结果可重现
    data = np.random.normal(170, 10, 1000)  # 1000个身高数据，均值170，标准差10
    
    # 使用numpy.histogram计算直方图
    hist, bins = np.histogram(data, bins=[150, 160, 170, 180, 190, 200])
    
    print("直方图统计结果:")
    print(f"区间: {bins}")
    print(f"频数: {hist}")
    
    # 创建图形
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
    
    # 第一个子图：使用plt.hist直接绘制
    ax1.hist(data, bins=20, color='lightblue', edgecolor='black', alpha=0.7)
    ax1.set_title('使用plt.hist直接绘制')
    ax1.set_xlabel('身高 (cm)')
    ax1.set_ylabel('频数')
    ax1.grid(True, alpha=0.3)
    
    # 第二个子图：使用numpy.histogram结果绘制
    ax2.bar(bins[:-1], hist, width=10, color='lightcoral', 
           edgecolor='black', alpha=0.7, align='edge')
    ax2.set_title('使用numpy.histogram结果绘制')
    ax2.set_xlabel('身高 (cm)')
    ax2.set_ylabel('频数')
    ax2.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.suptitle('直方图绘制方法对比', fontsize=14)
    plt.show()

def advanced_features():
    """高级功能演示"""
    print("\n=== 高级功能演示 ===\n")
    
    # 创建数据
    x = np.linspace(0, 10, 100)
    y1 = np.sin(x)
    y2 = np.cos(x)
    
    # 创建图形和主坐标轴
    fig, ax1 = plt.subplots(figsize=(12, 8))
    
    # 第一个Y轴（左侧）
    color = 'tab:blue'
    ax1.set_xlabel('X 轴')
    ax1.set_ylabel('正弦函数', color=color)
    line1 = ax1.plot(x, y1, color=color, linewidth=2, label='sin(x)')
    ax1.tick_params(axis='y', labelcolor=color)
    
    # 第二个Y轴（右侧）
    ax2 = ax1.twinx()
    color = 'tab:red'
    ax2.set_ylabel('余弦函数', color=color)
    line2 = ax2.plot(x, y2, color=color, linestyle='--', linewidth=2, label='cos(x)')
    ax2.tick_params(axis='y', labelcolor=color)
    
    # 组合图例
    lines = line1 + line2
    labels = [l.get_label() for l in lines]
    ax1.legend(lines, labels, loc='upper right')
    
    plt.title('双Y轴坐标图演示', fontsize=14)
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.show()

def main():
    """主函数"""
    print("=" * 60)
    print("          NumPy Matplotlib 完整演示脚本")
    print("=" * 60)
    
    # 检查安装
    if not check_matplotlib_installation():
        return
    
    # 设置中文字体
    setup_chinese_font()
    
    # 演示顺序
    demos = [
        ("基本线性图", basic_line_plot),
        ("格式化字符串", format_string_demo),
        ("三角函数波形", sine_wave_demo),
        ("子图功能", subplot_demo),
        ("条形图", bar_chart_demo),
        ("直方图", histogram_demo),
        ("高级功能", advanced_features)
    ]
    
    # 执行演示
    for i, (name, demo_func) in enumerate(demos, 1):
        print(f"\n{'='*50}")
        print(f"演示 {i}/{len(demos)}: {name}")
        print(f"{'='*50}")
        
        try:
            demo_func()
            print(f"✓ {name} 演示完成")
        except Exception as e:
            print(f"✗ {name} 演示失败: {e}")
        
        # 等待用户确认继续
        if i < len(demos):
            input("\n按回车键继续下一个演示...")
    
    print("\n" + "="*60)
    print("          所有演示已完成！")
    print("="*60)
    print("\n总结:")
    print("1. Matplotlib 是强大的Python绘图库")
    print("2. 支持线性图、条形图、直方图等多种图表")
    print("3. 提供丰富的格式化选项和子图功能")
    print("4. 可与NumPy完美配合进行科学计算可视化")

if __name__ == "__main__":
    main()